#pragma once

#include <iostream>

template <typename T>
class Singleton{
  private:
    volatile static T* inst;    //volatile关键字防止被编译器优化
    static std::mutex_t lock;
  public:
    static T* GetInstance(){
      if(inst == nullptr){      //双重判定空指针，降低锁冲突的概率，提高性能
        lock.lock();            //使用互斥锁，保证多线程情况下也只能调用一次new
        if(inst == nullptr){
          inst = new T();
        }
        lock.unlock();
      }

      return inst;
    }
};
